<?php
/**
 * $Id$
 * 单例模式数据库类
 */

class sp_mysql {
	
	/**
	 * 保存数据库连接资源
	 */
	private $link_id;

	/**
	 * 存储查询结果集
	 */
	private $result;

	/**
	 * 存储错误信息
	 */
	private $error_message = array();
	
	/**
	 * 保存类实例
	 */
	private static $instance = null;

	/**
	 * 构造函数
	 */
	private function __construct($dbhost,$dbuser,$dbpw,$dbname) {
		if (!$this->link_id = @mysql_connect($dbhost,$dbuser,$dbpw)) {
			$this->show_error('建立数据库连接失败！');
		}
		if ($this->getMysqlVersion() > '4.1') {
			mysql_query('SET NAMES "utf8"');
		}
		mysql_select_db($dbname,$this->link_id);
	}

	/**
	 * 取得类实例
	 */
	public static function get_instance() {
		if (self::$instance == null) {
			self::$instance = new sp_mysql();
		}
		return self::$instance;
	}

	/**
	 * 显示错误信息
	 */
	private show_error($message) {
		if ($message) {
			echo '<b>shop_php error:'.$message.'<br /><br />';
		} else {
			echo '<b>MySQL server error message:';
			print_r($this->error_message); echo '<br /><br />'; exit;
		}
	}

	/**
	 * 关闭数据库连接
	 */
	public function close() {
		return mysql_close($this->link_id);
	}

	/**
	 * 查询请求数据库
	 * 赋值给 $this->result 并且 return $this->result
	 */
	public function query($sql) {
		if (!$this->result = mysql_query($sql, $this->link_id)) {
			$this->error_message['message'] = 'MySQL query error:';
			$this->error_message['sql'] = $sql;
			$this->error_message['error'] = $this->get_error();
			$this->error_message['errno'] = $this->get_errno();

			$this->show_error();
			return false;
		}
	}

	/**
	 * 释放查询结果集
	 */
	public function free_result() {
		mysql_free_result($this->result);
	}

	/**
	 * 取得结果集合中的所有数据
	 */
	public function get_all($sql) {
		$this->query($sql);
		if ($this->result == false) return false;
		$arr = array();
		while ($row = mysql_fetch_assoc($this->result) {
			$arr[] = $row;
		}
		return $arr;
	}

	/**
	 * 从结果集中获得一行数据
	 */
	public function fetch_array() {
		return mysql_fetch_array($this->result);
	}

	public function once_fetch_array($sql) {
		$this->query($sqll);
		return mysql_fetch_array($this->result);
	}

	/**
	 * 取得结果集的记录数
	 */
	public function num_rows() {
		return mysql_num_rows($this->result);
	}

	/**
	 * 取得结果集中的字段数
	 */
	public function num_fields() {
		return mysql_num_fields($this->result);
	}

	/**
	 * 取得上一步 INSERT 操作产生的ID
	 */
	public function insert_id() {
		return mysql_insert_id($this->link_id);
	}

	/**
	 * 获得 MySQL错误
	 */
	public function get_error() {
		return mysql_error($this->link_id);
	}
	
	public function get_errno() {
		return mysql_errno($this->link_id);
	/**
	 * 获得上次查询所影响的行数
	 */
	public function affected_rows() {
		return mysql_affected_rows();
	}

	/**
	 * 返回结果集中某个记录
	 */
	public function get_row($row) {
		return mysql_result($this->link_id, $row);
	}
}
